#include "SerialScreenTask.h"
#include "cmsis_os.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ControlTask.h"

// 当前错误码变量
SerialScreenErrCode_t SerialScreenErrCode = SERIALSCREEN_OK;

// 指令类型封装函数

// 串口屏指令1: 设置变量
void SerialScreen_SetVar(const char *var, const char *value) {
    printf("%s=%s;\r\n", var, value);
}

// 串口屏指令2: 页面切换
void SerialScreen_PageSwitch(const char *page) {
    printf("page(%s);\r\n", page);
}

// 串口屏指令3: 获取变量
void SerialScreen_GetVar(const char *var) {
    printf("get(%s);\r\n", var);
}

// 串口屏协议解析函数（上位机/串口屏格式: page1 led0 on/pump on/heat off等）
void SerialScreen_Parse(const char *msg) {
    // 拷贝一份，避免破坏原始字符串
    char buf[64];
    strncpy(buf, msg, sizeof(buf) - 1);
    buf[sizeof(buf) - 1] = '\0';

    // 1. 解析串口屏返回的错误或警告格式，如 "err:1;" 或 "war:128;"
    if (strncmp(buf, "err:", 4) == 0 || strncmp(buf, "war:", 4) == 0) {
        // 查找冒号和分号
        char *colon = strchr(buf, ':');
        char *semicolon = strchr(buf, ';');
        if (colon && semicolon && semicolon > colon) {
            auto code = atoi(colon + 1);
            SerialScreenErrCode = (SerialScreenErrCode_t) code;
        } else {
            SerialScreenErrCode = SERIALSCREEN_UNKNOWN;
        }
        return;
    }

    // 按空格分割
    char *argv[4] = {0};
    int argc = 0;
    char *token = strtok(buf, " \r\n");
    while (token && argc < 4) {
        argv[argc++] = token;
        token = strtok(NULL, " \r\n");
    }

    if (argc == 0) {
        SerialScreenErrCode = SERIALSCREEN_ERR_UNRECOGNIZED_VAR_OR_CMD;
        return;
    }

    // 1. 页面切换 page1
    if (strncmp(argv[0], "page", 4) == 0 && strlen(argv[0]) > 4) {
        // 例：上位机发送 "page1" 可切换到第1页，"page2"切换到第2页
        SerialScreen_PageSwitch(argv[0] + 4);
        SerialScreenErrCode = SERIALSCREEN_OK;
        return;
    }

    // 2. 控件控制 led0 on/off
    if (argc >= 2 && strncmp(argv[0], "led", 3) == 0) {
        // 例：上位机发送 "led0 on" 控制led0打开，"led1 off" 控制led1关闭
        SerialScreen_SetVar(argv[0], (strcmp(argv[1], "on") == 0) ? "1" : "0");
        SerialScreenErrCode = SERIALSCREEN_OK;
        return;
    }

    // 3. 控制水泵/加热/排水/备用继电器
    if (argc >= 2) {
        if (strcmp(argv[0], "pump") == 0) {
            // 例：上位机发送 "pump on" 打开水泵，"pump off" 关闭水泵
            Relay_PUMP_Operate(strcmp(argv[1], "on") == 0 ? ON : OFF);
            SerialScreenErrCode = SERIALSCREEN_OK;
            return;
        }
        if (strcmp(argv[0], "heat") == 0) {
            // 例：上位机发送 "heat on" 打开加热，"heat off" 关闭加热
            Relay_Heat_Operate(strcmp(argv[1], "on") == 0 ? ON : OFF);
            SerialScreenErrCode = SERIALSCREEN_OK;
            return;
        }
        if (strcmp(argv[0], "drainage") == 0) {
            // 例：上位机发送 "drainage on" 打开排水，"drainage off" 关闭排水
            Relay_Drainage_Operate(strcmp(argv[1], "on") == 0 ? ON : OFF);
            SerialScreenErrCode = SERIALSCREEN_OK;
            return;
        }
        if (strcmp(argv[0], "backup") == 0) {
            // 例：上位机发送 "backup on" 打开备用继电器，"backup off" 关闭备用继电器
            Relay_Backup_Operate(strcmp(argv[1], "on") == 0 ? ON : OFF);
            SerialScreenErrCode = SERIALSCREEN_OK;
            return;
        }
    }

    // 4. 其他自定义指令可扩展
    // ...

    // 未识别指令
    // 例：上位机发送 "abc xyz" 或其他未定义指令会进入此分支
    SerialScreenErrCode = SERIALSCREEN_ERR_UNRECOGNIZED_VAR_OR_CMD;
}

void SerialScreen_Task(void const *argument) {
    // 初始化代码(只运行一次)

    while (1) {
        // 任务代码(要循环的)

        // 任务延时，让其他任务运行
        osDelay(10);
    }
}
